#include "system_app.h"
#include <stdio.h>
/**
 ****************************************************************************************************
 *串口：
 *      串口1：show/下载
 *              TX1---->PA9
 *              RX1---->PA10
 *      串口2：蓝牙
 *              TX2---->PA2
 *              RX2---->PA3
 *      串口3：wifi
 *              TX3---->PB10
 *              RX3---->PB11
 *测试灯：
 *      LED1 ---->PC0
 *      LED2 ---->PC1
 *      LED3 ---->PC2
 *传感器：
 *      超声波传感器：
 *           TRIG---->PB14
 *           ECHO---->PC6
 *电机：timer2/timer3 
 *      左前电机:
 *              AIN1---->PB8      
 *              BIN1---->PB9     
 *      右前电机：
 *              AIN2---->PB0
 *              BIN2---->PB1
 *      左后电机：
 *              AIN3---->PB6
 *              BIN3---->PB7
 *      右后电机：
 *              AIN4---->PA6
 *              BIN4---->PA7
 * 
 *舵机：timer1
 *      pwm1---->PA8
 *      PWM2---->PA11
 ****************************************************************************************************
 */

/**
 ****************************************************************************************************
 * DONE 变量
 ****************************************************************************************************
 */

//定时器计数
uint32_t timer_count = 0;

//LED状态位
uint8_t LED1_Status = 0;
uint8_t LED2_Status = 0;
uint8_t LED3_Status = 0;
//蜂鸣器状态位
uint8_t BEEP_Status = 0;
//蜂鸣器计数位
uint16_t BEEP_Time = 0;

//系统模式状态位
uint8_t System_Mode_Status = 0;
//系统状态位
uint8_t System_Status = 0;

//超声波状态位
uint8_t Ultrasonic_Status1 = 0;
uint8_t Ultrasonic_Status2 = 0;
//超声波计数位
uint16_t Ultrasonic_Time = 0;
//超声波距离值
double Ultrasonic_Value = 0.0;

//LCD
char LCD_ClearRow[] = "               ";

/**
 ****************************************************************************************************
 * 系统函数
 ****************************************************************************************************
 */

/**
 * @name 系统初始化函数
 * @brief 对系统全部外设的初始化
 */
void system_Init(void)
{
    uart_Init();
    USART_printf(show_huart,"LCD INIT START\r\n"); 
	LCD_Init();
    USART_printf(show_huart,"LCD INIT END\r\n"); 
    USART_printf(show_huart,"MOTOR INIT START\r\n"); 
    MOTOR_Init();
    USART_printf(show_huart,"MOTOR INIT END\r\n"); 
    USART_printf(show_huart,"SENSOR INIT START\r\n"); 
    SENSOR_Init();
    USART_printf(show_huart,"SENSOR INIT END\r\n"); 
    USART_printf(show_huart,"SERVO INIT START\r\n"); 
    Servo_Init();
    USART_printf(show_huart,"SERVO INIT END\r\n"); 

    LCD_Fill(0,0,128,160,BLACK);

    USART_printf(show_huart,"SYSTEM INIT OK\r\n"); 

    HAL_TIM_Base_Start_IT(&htim5);
}

/**
 * @name 系统运行函数
 * @brief 系统运行逻辑
 */
void system_run(void)	
{
    if(!System_Status)
    {
        USART_printf(show_huart,"SYSTEM RUN START\r\n"); 
        System_Status = 1;
    }

    if(LED1_Status) LED_SetValue(1,GPIO_PIN_RESET);
    else LED_SetValue(1,GPIO_PIN_SET);
    if(LED2_Status) LED_SetValue(2,GPIO_PIN_RESET);
    else LED_SetValue(2,GPIO_PIN_SET);
    if(LED3_Status) LED_SetValue(3,GPIO_PIN_RESET);
    else LED_SetValue(3,GPIO_PIN_SET);
    if(BEEP_Status) BEEP_SetValue(GPIO_PIN_SET);
    else BEEP_SetValue(GPIO_PIN_RESET);

    switch (System_Mode_Status)
    {
    case 0 :    LCD_ShowString(1,1,"standby mode             ",WHITE,BLACK,12,0); //待机模式
    break;
    case 1 :    LCD_ShowString(1,1,"Bluetooth mode           ",WHITE,BLACK,12,0); //蓝牙模式
    break;
    case 2 :    LCD_ShowString(1,1,"Tracking mode            ",WHITE,BLACK,12,0); //循迹模式
    break;
    case 3 :    LCD_ShowString(1,1,"Ultrasonic mode          ",WHITE,BLACK,12,0); //避障模式
    break;
    case 4 :    LCD_ShowString(1,1,"WiFi mode                ",WHITE,BLACK,12,0); //WIFI模式
    break;
    default:
    break;
    }

    if(System_Mode_Status == 1)//蓝牙模式
    {
        BLE_Control();
        char BLEstring[10];
        BLE_SHOW(BLE_Control_Status, BLEstring, sizeof(BLEstring));
        LCD_ShowString(1,60,(uint8_t*)BLEstring,WHITE,BLACK,16,0);
    }
    else if(System_Mode_Status == 2)//循迹模式
    {
        Track_Car(750);
        char tempstring[] = " ";
    #if TRACK_GETDATA_MODE == 0
        sprintf(tempstring,"T_Value = %05d",track_Data);
    #elif TRACK_GETDATA_MODE == 1
        sprintf(tempstring,"T_Value = %d%d%d%d%d",(Track_Data>>4)&1,(Track_Data>>3)&1,(Track_Data>>2)&1,(Track_Data>>1)&1,(Track_Data>>0)&1);
    #endif
        LCD_ShowString(1,20,(uint8_t*)tempstring,WHITE,BLACK,16,0);
    }
    else if(System_Mode_Status == 3)//避障模式
    {
        if(Ultrasonic_Status1)
        {
            CAR_STOP(500);
            Ultrasonic_Status1 = 0;
        }
        Ultrasonic_Value = UltrasonicGetLength();
        char tempstring[] = " ";
        sprintf(tempstring,"U_Value = %.2f",Ultrasonic_Value);
        
        if(Ultrasonic_Value < 18) CAR_BACK(650);
        else if(Ultrasonic_Value >= 18 && Ultrasonic_Value <= 35) CAR_TURN_LEFT(650);
        else CAR_FRONT(800);

        LCD_ShowString(1,40,(uint8_t*)tempstring,WHITE,BLACK,16,0);
    }
    else if(System_Mode_Status == 4)//WIFI模式
    {
        Ultrasonic_Status1 = 1;
        WIFI_Control();
        char WIFIstring[10];
        WIFI_SHOW(BLE_Control_Status, WIFIstring, sizeof(WIFIstring));
        LCD_ShowString(1,80,(uint8_t*)WIFIstring,WHITE,BLACK,16,0);
    }
    else if(System_Mode_Status == 0)
    {
        LCD_ShowString(1,20,(uint8_t*)LCD_ClearRow,WHITE,BLACK,16,0);
        LCD_ShowString(1,40,(uint8_t*)LCD_ClearRow,WHITE,BLACK,16,0);
        CAR_STOP(900);
    }

}


/**
 ****************************************************************************************************
 * 中断回调
 ****************************************************************************************************
 */

//按键中断回调
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == KEY1_Pin)
    {
        //处理部分
        if(KEY_READValue() == 0)
        {
            System_Mode_Status++;
            if(System_Mode_Status >= 5) System_Mode_Status = 0;
            BEEP_Status = 1;
        }
        
        //清除中断标志
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    }
}

//定时器中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim == &htim5)     //传输数据所用   //内部时钟72MHz, PSC == 72-1, ARR == 2000-1    //频率500Hz 每2毫秒触发一次
    {
        
        timer_count++;
        if(timer_count < 200) LED3_Status = 1;
        else if(timer_count < 400) LED2_Status = 1;
        else if(timer_count < 800) LED1_Status = 1;
        else if(timer_count < 1000) 
        {
            LED1_Status = 0;
            LED2_Status = 0;
            LED3_Status = 0;
        }
        else if(timer_count > 1000) timer_count = 0;

        if(BEEP_Status == 1) BEEP_Time++;
        if(BEEP_Time > 150)
        {
            BEEP_Status = 0;
            BEEP_Time = 0;
        }

    }
    else  if (htim == &htim2)     //超声波测距所用 //内部时钟72MHz, PSC == 72-1, ARR == 65536-1    //频率15.26Hz 每65.536毫秒触发一次
    {
        msHcCount++; // 每次 TIM2 溢出中断，增加 1ms
    }
}


/**
 ****************************************************************************************************
 * 任务回调
 ****************************************************************************************************
 */



 
